﻿
namespace Leetcode.N1353;

public class Solution
{
    public int MaxEvents(int[][] events)
    {

        events = events.OrderByDescending(i => i[1]).ToArray();

        var queue = new PriorityQueue<int, int>();

        var ans = 0;
        var eventDay = events[0][1];
        int index = 0;

        while (eventDay > 0)
        {
            // 从最后一天开始找当天能开的会议
            while (index < events.Length && events[index][1] == eventDay)
            {
                queue.Enqueue(index, -events[index][0]);
                index++;
            }

            // 查找开始时间最大的，当天能开的会议。会议开始时间大于当天就是无效会议
            int nextIndex = -1;
            while (queue.Count > 0)
            {
                var i = queue.Dequeue();

                if (events[i][0] <= eventDay)
                {
                    nextIndex = i;
                    break;
                }
            }

            // -1表示当天没有可以开的会议
            if (nextIndex == -1)
            {
                if (index < events.Length)
                {
                    // 当天没有会议，那么下个会议的时间就是前一天及下个会议的结束时间的最小值
                    eventDay = Math.Min(eventDay - 1, events[index][1]);
                }
                else
                {
                    // 没有会议了退出
                    break;
                }
            }
            else
            {
                // 下个会议的时间是前一天和当前会议的前一天的最小值
                eventDay = Math.Min(eventDay - 1, events[nextIndex][1] - 1);
                ans++;
            }
        }
        return ans;
    }
}

